package br.com.officium.entidade.cadastro;

import br.com.officium.entidade.cadastro.enums.SituacaoProcessoEnum;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.persistence.*;

/**
 *
 * @author Ivo
 */
@Entity
@Cacheable(true)
public class Processo implements Serializable {

    @Id
    private String numero;

    @ManyToOne
    private Advogado advogadoResponsavel;

    @ManyToOne
    private Advogado supervisor;

    @OneToMany(cascade = CascadeType.ALL)
    private List<ParteContraria> partesContrarias;

    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataDistribuicao;

    @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE, CascadeType.DETACH})
    private Acao acao;

    @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE, CascadeType.DETACH})
    private LocalTramitacao localTramitacao;

    private String vara;

    private BigDecimal valorCausa;

    @Enumerated
    private SituacaoProcessoEnum situacaoProcesso;

    @Enumerated
    private SituacaoProcessoEnum situacaoAtual;

    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataCadastro;

    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataAtualizacao;
    
    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE, CascadeType.DETACH})
    private ClienteFisico clienteFisico;
    
    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE, CascadeType.DETACH})
    private ClienteJuridico clienteJuridico;
    
    private Processo processoMae;
    
    public Processo() {
    }

    public Date getDataCadastro() {
        return dataCadastro;
    }

    public void setDataCadastro(Date dataCadastro) {
        this.dataCadastro = dataCadastro;
    }

    public Date getDataAtualizacao() {
        return dataAtualizacao;
    }

    public void setDataAtualizacao(Date dataAtualizacao) {
        this.dataAtualizacao = dataAtualizacao;
    }

    public Acao getAcao() {
        return acao;
    }

    public void setAcao(Acao acao) {
        this.acao = acao;
    }

    public Advogado getAdvogadoResponsavel() {
        return advogadoResponsavel;
    }

    public void setAdvogadoResponsavel(Advogado advogadoResponsavel) {
        this.advogadoResponsavel = advogadoResponsavel;
    }

    public Date getDataDistribuicao() {
        return dataDistribuicao;
    }

    public void setDataDistribuicao(Date dataDistribuicao) {
        this.dataDistribuicao = dataDistribuicao;
    }

    public LocalTramitacao getLocalTramitacao() {
        return localTramitacao;
    }

    public void setLocalTramitacao(LocalTramitacao localTramitacao) {
        this.localTramitacao = localTramitacao;
    }

    public String getNumero() {
        return numero;
    }

    public void setNumero(String numero) {
        this.numero = numero;
    }

    public List<ParteContraria> getPartesContrarias() {
        return partesContrarias;
    }

    public void setPartesContrarias(List<ParteContraria> partesContrarias) {
        this.partesContrarias = partesContrarias;
    }

    public SituacaoProcessoEnum getSituacaoAtual() {
        return situacaoAtual;
    }

    public void setSituacaoAtual(SituacaoProcessoEnum situacaoAtual) {
        this.situacaoAtual = situacaoAtual;
    }

    public SituacaoProcessoEnum getSituacaoProcesso() {
        return situacaoProcesso;
    }

    public void setSituacaoProcesso(SituacaoProcessoEnum situacaoProcesso) {
        this.situacaoProcesso = situacaoProcesso;
    }

    public Advogado getSupervisor() {
        return supervisor;
    }

    public void setSupervisor(Advogado supervisor) {
        this.supervisor = supervisor;
    }

    public BigDecimal getValorCausa() {
        return valorCausa;
    }

    public void setValorCausa(BigDecimal valorCausa) {
        this.valorCausa = valorCausa;
    }

    public String getVara() {
        return vara;
    }

    public void setVara(String vara) {
        this.vara = vara;
    }

    public ClienteFisico getClienteFisico() {
        return clienteFisico;
    }

    public void setClienteFisico(ClienteFisico clienteFisico) {
        this.clienteFisico = clienteFisico;
    }

    public ClienteJuridico getClienteJuridico() {
        return clienteJuridico;
    }

    public void setClienteJuridico(ClienteJuridico clienteJuridico) {
        this.clienteJuridico = clienteJuridico;
    }

    public Processo getProcessoMae() {
        return processoMae;
    }

    public void setProcessoMae(Processo processoMae) {
        this.processoMae = processoMae;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Processo other = (Processo) obj;
        if (this.numero != other.numero && (this.numero == null || !this.numero.equals(other.numero))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 19 * hash + (this.numero != null ? this.numero.hashCode() : 0);
        return hash;
    }

    @Override
    public String toString() {
        return String.format("Processo{id=%s}", numero);
    }

}
